package com.huike.springboot1.demos.controller;

import com.huike.springboot1.demos.pojo.User;
import com.huike.springboot1.demos.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.util.ArrayList;
import java.util.List;

@Controller
public class BasicController {
//    在"工具"里有“HTTP客户端”可创建一个http请求，可进行修改指定端口的内容,需要程序执行才能有效
    // http://127.0.0.1:8080/hello?name=lisi
    @RequestMapping("/hello")
//    @GetMapping("/hello")
//    @PostMapping("hello")
//    @PutMapping("hello")
//    @DeleteMapping("hello")

//    @RequestMapping 给这个方法添加一个访问路径：不限制请求方式的访问路径
//    @Get   获取，获取信息、数据使用，Get请求的参数会拼接在路径之后。
//    参数拼接在url的?之后，参数名=参数值，多个参数之间用&间隔；可缓存当前页面信息，可重复获取，方便下一次加载
//      参数有长度限制
//    域名和ip端口是绑定的，绑定是方便于记忆。网址组成：域名:端口/方法接口?参数名=参数值&参数名1=参数值1&...
//    @Post   提交：参数不可见(但可以用开发者工具/抓包查看参数)，相对get请求安全一点；信息不可缓存，参数没有长度限制
//    @Put  修改，丛属于Post请求
//    @Delete 删除 丛属于Post请求

//    RestFul接口命名规范：路径一致，请求方式不同则操作不同，可通过请求方式+请求路径，了解该接口作用
//      新增Post   /user
//      修改Put    /user/{userID}
//      删除Delete /user/{userID}
//      查询Get    /user/{userID}

    @ResponseBody
//    Response：响应；Request：请求。
//    @ResponseBody：作用：返回json格式数据，有这个注解没有则返回页面，有这个注解有则返回具体内容
//    将所有返回信息全部转换成JSON格式(本质是有特定格式的字符串)，是常用于前后端数据交互的数据格式
/*    JSON格式：键值对：数字："key":123  字符串："key":"value"
                      对象：{
                                "key1":"value1",
                                "key2":"value2"
                           }
                      集合：[
                               {
                                "key11":"value11 ",
                                "key12":"value12"
                               },
                               {
                                 "key21":"value21",
                                 "key22":"value22"
                               }
                           ]
*/
//    响应一个字符串(Hello 李四)，数字，对象,集合。要想返回一个对象就要使用toString()方法

//    @RequestParam的参数列表里，获取请求参数名:name,设置默认值:unknown user，
//          作用将请求参数name映射给形参name，用户访问时提交的参数和形参绑定，如果http对应的参数名不对应则使用默认值

    public String hello(@RequestParam(name = "xxx", defaultValue = "unknown user") String name) {
        return "Hello " + name;
    }
//@RequestParam 设置请求参数和形参对应关系的注解，注解里也有参数
    @RequestMapping ("/getUserList")
    @ResponseBody
    public List<User> getUserList() {
        ArrayList<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setUsername("张三");
        user1.setAge(20);
        users.add(user1);
        User user2 = new User();
        user2.setUsername("李四");
        user2.setAge(22);
        users.add(user2);
        User user3 = new User();
        user3.setUsername("王五");
        user3.setAge(30);
        users.add(user3);
        return users;
    }

//    商品信息方法控制层：
    @Autowired
    ProductService productService;
    //    删除方法一：删除方法二：使用浏览器方式
    //网络路径(项目路径)
    @GetMapping("/productTable")
//    控制层通过访问项目路径，可以将数据库中的数据以products为参数名传递到productList页面
//    Model：是SpringMVC中的"M“：模型(数据),前后端交互时的数据模型,后端向前端传递数据使用model    "V"：视图(页面)
    public ModelAndView getProductList(ModelAndView modelAndView) {
        //TODO
//        model将数据作为products参数传递productList(视图)，括号内的内容是，参数名,参数值
        modelAndView.addObject("products", productService.getProductList());
        modelAndView.setViewName("admin/productTable");
        return modelAndView;
    }

    @RequestMapping("/deleteProduct")
    public String deleteProduct(Long id, Model model) {
//        增删改一条数据操作，不需要返回类型，在数据库中增删改一条数据就是返回int的数字类型的行数，没有返回数据类型的意义
        productService.deleteProductById(id);
        //TODO
//        model将数据作为products参数传递productList(视图)，括号内的内容是，参数名,参数值
        model.addAttribute("products", productService.getProductList());
        return "admin/productTable";//返回一个在templates路径下的页面名称，productList是templates里的文件
        // 传递到页面的数据product可以通过美元符号$进行获取 ，在全局配置文件中设置页面文件路径

    }
}
